package com.hsu.hsurpc.registry;

import com.hsu.hsurpc.spi.SpiLoader;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 注册中心工厂，用于根据 key 获取注册中心实例，支持懒加载
 * @Author Hsu琛君珩
 * @Date 2024-09-20 17:27
 * @Description
 * @Version: v1.0.0
 */
public class RegistryFactory {

    /**
     * 存储各个注册中心实例的 Map，使用线程安全的 ConcurrentHashMap
     */
    private static final Map<String, Registry> KEY_REGISTRY_MAP = new ConcurrentHashMap<>();

    /**
     * 默认注册中心实例（Etcd 实现）
     */
    private static final Registry DEFAULT_REGISTRY = new EtcdRegistry();

    /**
     * 获取注册中心实例，使用懒加载方式，只有在首次请求时创建实例
     *
     * @param key 注册中心的名称（如 "etcd", "zookeeper"）
     * @return 注册中心实例
     */
    public static Registry getInstance(String key) {
        // 从 Map 中获取已有实例，如果不存在则进行创建
        return KEY_REGISTRY_MAP.computeIfAbsent(key, RegistryFactory::createRegistry);
    }

    /**
     * 创建注册中心实例的方法，通过 SPI 动态加载指定的注册中心
     *
     * @param key 注册中心名称
     * @return 创建好的注册中心实例
     */
    private static Registry createRegistry(String key) {
        // 使用 SPI Loader 动态加载注册中心实现类
        Registry registry = SpiLoader.getInstance(Registry.class, key);
        // 如果找不到指定的实现类，使用默认注册中心（Etcd）
        return (registry != null) ? registry : DEFAULT_REGISTRY;
    }
}
